Download
Showing posts with label Tip and Trik. Show all posts
Showing posts with label Tip and Trik. Show all posts

3/01/2013

Text to Bit Converter untuk merancang karakter dot matrix


Jika mengalami kebingungan untuk mendesain karakter dot matrix, saya kasi tools yg mungkin bermaanfaat untuk merubah karakter ke bit.





Mudah-mudahan membantu praktek belajar menulis di dot matrix yang tersedia di paket belajar mikrokontroler

2/28/2013

DISPLAY 7 SEGMEN + DADU DIGITAL dengan IC 4026

Bahan-Bahan :
<!--[if !supportLists]-->1. <!--[endif]-->IC 555
<!--[if !supportLists]-->2. <!--[endif]-->IC 4026
<!--[if !supportLists]-->3. <!--[endif]-->Resistor 10k ohm (1buah), 100Kohm (1 buah) atau diganti dengan Potensiometer 100k ohm, 220 ohm (7 buah bila perlu)
<!--[if !supportLists]-->4. <!--[endif]-->Kapasitor 10 uF (1 buah)
<!--[if !supportLists]-->5. <!--[endif]-->Tombol tekan / push button
<!--[if !supportLists]-->6. <!--[endif]-->Baterai 4.5V
<!--[if !supportLists]-->7. <!--[endif]-->Kabel Jumper secukupnya

Skematik :
Keterangan : perhatikan kaki IC yg tidak urut, sesuaikan nomer kaki pada skematik dengan kaki pin di IC sebenarnya

Langkah Merakit ke Breadboard :

<!--[if !supportLists]-->1. <!--[endif]-->Setelah paham merangkai percobaan 555 maka percobaan kali ini akan mudah saja tinggal mengikuti gambar skematik yang ditampilkan sebelumnya, dan hasil di breadboard seperti ini :




<!--[if !supportLists]-->2. <!--[endif]-->Pushbutton memiliki 4 kaki dimana ada 2 buah pasang kaki yg tersambung.
<!--[if !supportLists]-->3. <!--[endif]-->Jika tegangan baterai melebihi 6V, maka sebelum masuk ke 7 segmen diperlukan resistor 220 ohm atau lebih. Jika memakai 4.5 V resistor bisa tidak dipakai.
<!--[if !supportLists]-->4. <!--[endif]-->Putar-putar potensiometer untuk mendapatkan kecepatan penambahan digit yang diinginkan.
<!--[if !supportLists]-->5. <!--[endif]-->Jika kecepatan perubahan digit sangat cepat, maka rangkaian ini dapat digunakan sebagai “DADU ELEKTRONIK”. Jadi ketika tombol ditekan maka angka akan berhenti pada digit angka yang tidak kita duga sebelumnya.

2/27/2013

Tutorial Eagle Step By Step

Kali ini akan kita bahas mengenai routing pcb dengan menggunakan Eagle Cad Software. Software eagle adalah software cad paling umum digunakan kalangan pelajar, karena ada license yg bisa dibeli murah jika status masih pelajar/mahasiswa. Tapi "jamu" buat software ini banyak jadi silahkan ubek-ubek aja dunia maya(not Recommended)


1. Membuat Schematic Baru

Buatlah Nama project yg dikehendaki dilanjutkan dengan membuat schematic sesuai gambar berikut:



setelah itu akan muncul windows baru / worksheet tempat kita menggambar schematic


2. Menyusun Schematic diatas Editor

Langkah pertama adalah dengan memilih komponen yg digunakan melalui tombol "ADD" . Jika ada komponen yg digunakan sejenis dan berulang, hanya diperlukan pemilihan sekali saja selanjutnya bisa dicopy paste di editornya



contoh diatas jika kita ingin memilih komponen IC CMOS 4017



contoh diatas jika ingin menambah simbol supply GROUND

setelah semua komponen diletakkan di editor maka dilanjutkan dengan menghubungkan kaki-kaki komponen sesuai dengan keinginan. Toolbar sebelah kiri sangat membantu dalam pengaturan schematic, seperti ilustrasi berikut ini



klik gambar untuk memperbesar


beberapa komponen tidak mencantumkan kaki-kaki yg umum seperti VCC & GND (tapi di pcb ada) , kadang ini akan membuat bingung...jangan khawatir kita "INVOKE" saja melalui toolbar sesuai gambar berikut



3. Routing PCB

Setelah semua schematic disusun sesuai keinginan, lanjutkan menuju ke PCB routing dengan perintah File==>Switch to Board

Mulanya akan muncul PCB dengan kabel semrawut dan tanpa grid/kotak seperti gambar dibawah. Pindahkan semua komponen dengan :toolbal move + toolbar select + drag mouse ke semua komponen + klik kanan + Move group, ke dalam kotak PCB layout




Setelah itu susun komponen sesuai keinginan dan selanjutnya bisa membuat layout PCB secara AUTO dengan memilih tombol auto route dan memilih jumlah layer pcb yg diinginkan




klik untuk memperbesar


jika ingin kembali ke mode awal sebelum di routing maka tinggal ikuti urutan ...pilih ripup + pilih select + drag mouse ke komponen + klik kanan + pilih ripup group




4. Routing Manual

Terkadang routing auto akan menghasilkan routing yg aneh2 dan ga masuk akal. Untuk itu perlu dilakukan routing manual. Toolbar yg penting adalah "ROUTE", "RIPUP" , "VIA" dan "RATSNET" sesuai gambar dibawah . Untuk meroutingkan PCB klik toolbar ROUTE dan klik antara kaki komponen yg akan di sambung. Ukuran routing dapat dipilih di toolbar sebelah atas ( "width"). Jika routing manual tidak memungkinkan maka jurus VIA / Jumper dapat membantu dengan membuat "AIRWAYS" yg nantinya akan disolder dengan kabel pada bagian atas PCB



klik untuk memperbesar


untuk mempercantik PCB dan menghemat waktu "ETCHING", maka daerah2 yg kosong perlu diberikan suatu gambar polygon. Pada umumnya polygon juga mewakili sinyal yg common/dipake berulang di PCB, umumnya sih untuk menghubungkan semua sinyal ground. Untuk membuatnya gampang saja, dengan menggambar polygon disekitar komponen dan menamakannya dengan nama signal yg akan disambungkan. jika tidak diberi nama maka polygon akan berdiri sendiri.




dan ketika tombol RATSNET ditekan maka PCB akan menjadi terhubung seperti ini



tetapi permasalahannya antara polygon dan routing terlalu mepet...jangan khawatir, kita atur saja jarak antar routing melalui "DRC RULES"



setting DRC ini dapat disimpan dan dipanggil pada desain PCB selanjutnya




4. PrintOut PCB

Setelah PCB layout selesai, dilanjutkan dengan printing layout ke atas kertas , plastik transparansi, glossy dsb. Layer yg dipilih hanya BOTTOM, PADS, dan VIA




selanjutnya lakukan printing secara mirror (untuk cara setrika) atau disesuaikan dengan kebutuhan






2/26/2013

BIKIN PCB MURAH MERIAH tapi KUALITAS OK !



untuk membuat PCB home made, ada bermacam cara
bisa didapat di instructable.com , seabrek cara dibeber disana
tapi yang menurut saya mengeluarkan uang paling sedikit cara yg satu ini

1. Desain PCB melalui software CAD semacam Eagle layout atau sebangsanya
Tinggal googling aja, banyak tersedia EAGLE Layout Editor + kracknya

2. Print Hasil Layout PCB dengan LASER PRINTER, keatas kertas MAJALAH BEKAS. yang dipakai adalah kertas majalah (biasanya majalah bisnis) yang tipis & mengkilat. Majalah / Buletin TV kabel contoh yg paling gampang

3. Bila tidak ada printer laser, print di kertas biasa, kemudian Lakukan PhotoCopy diatas kertas majalah tadi

4. siapkan PCB polos ( 1 layer saja), bersihkan dari kotoran menggunakan kertas gosok halus

5. Panaskan SETRIKA, kemudian setrika kertas majalah yg sudah ada gambar PCB nya tadi ke atas tembaga PCB , tekan2, mungkin diperlukan trial & error beberapa kali dan perkirakan transfer sudah merata baru kita boleh selesai setrika.

6. Rendam PCB tadi di air hangat ( dingin juga boleh) sampai kertas tipis tadi mengelupas, hati2 agar tidak merusak jalur PCB. Pastikan semua kertas yg ada di LUAR JALUR bersih , sedangkan yang di atas jalur tidak masalah jika ada sisa kertas ( asal tidak meninggalkan serat2 berlebihan) . perbaiki jalur2 yang mungkin rusak/ tipis dengan spidol permanen.

7. Siap di etching ( pake Ferry Clorit ataupun larutan HCL + H202)

8. Untuk ferry clorit, gunakan air hangat (jangan panas), perlu goyang2 tempat/ wadah etchingnya, tambahkan feri clorit ke larutan jika kekuatan oksidasinya berkurang, larutan sisa bisa disimpan & dipakai lagi untuk proses etching di lain waktu ( tambah feri clorit baru sedikit saja).

9. HCL yg umum dijual = 30 %, H202 < 5 % , jika kondisi seperti ini bisa di gunakan komposisi 1:1 atau 3:4 , ingat tuang HCL ke H202, jangan sebaliknya. jika komposisi H202 > 10 %, perlu penambahan air agar tidak terlalu cepat proses oksidasinya ( merusak masking )

10. HCL + H202 hanya sekali pake, sebab tidak bisa disimpan dalam botol

11. setelah proses etching dirasa selesai, bilas PCB dengan air hangat atau air mengalir (kran)

12. PCB siap di bor, setelah semua lubang komponen di bor, bersihkan masking dengan Aceton / thiner CAT A. Agar PCB tampak bersih & tidak beroksidasi dengan udara, bisa dilaminasi dengan lapisan perak (mahal), liquid tin ( mahal & jarang ada), atau di lapisi ( tipis) dengan cat semprot (lacquer) transparan ( 10 ribu juga dapet)

13. PCB siap di solder

2/23/2013

Jam Sederhana Dengan Attiny 2313

Kali ini kita akan menggunakan 4 buah 7 segment untuk membuat jam sederhana


"wahhh..kalo banyak 7 segmentnya, ngabisin banyak port dong ?"



Jangan khawatir, kita pake teknik " SCANNING", artinya kita hidupin segment satu persatu, tiap segment diparalel saja...tp kita hidupin dengan memberikan switch/saklar ke common port 7segment yg dikontrol oleh port micro ..dan scanningnya cepetttt...sehingga mata kita melihatnya seperti nyala biasa aja.

jadi untuk bikin 7-segment 4 buah, diperlukan 7 port display(diparalel) + 4 port control

rangkaiannya seperti berikut :

klik untuk memperbesar gambar

Biasanya untuk display yg agak besar, kita perlu transistor untuk mengatur scanning, tp karena contoh kali ini memakai segment yg kecil maka tidak memerlukan kontrol memakai transistor ( coba pake transistor dijamin nyalanya redup !!)


Prinsip jam kali ini menggunakan prinsip DELAY, jadi tidak terlalu akurat.
Sebenernya mau seh membagi ilmu untuk jam yg super akurat, tapi ntar aja yahh..soalnya memerlukan pengetahuan mengenai "Timer/Counter" dari microcontroller

source code nya sebagai berikut :

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int jam=0, min=0, detik=0; //variable global untuk menyimpan data2 waktu

void segmen (int angka)

{

switch (angka)
{

case 0 : { PORTB =0b1000000; break ; }
case 1 : { PORTB =0b1111001; break ; }
case 2 : { PORTB =0b0100100; break ; }
case 3 : { PORTB =0b0110000; break ; }
case 4 : { PORTB =0b0011001; break ; }
case 5 : { PORTB =0b0010010; break ; }
case 6 : { PORTB =0b0000010; break ; }
case 7 : { PORTB =0b1111000; break ; }
case 8 : { PORTB =0b0000000; break ; }
case 9 : { PORTB =0b0010000; break ; }
case 10 : { PORTB =0b1111111; break ; } //blank biar ga berbayang
}


}


void clock (void) //fungsi penambah waktu

{

detik ++; //jika fungsi dipanggil maka var detik ditambah

if ( detik == 60) // tambahkan menit jika 60 detik
{ detik=0; //untuk kembali ke 0
min++;
}

if ( min == 60) // tambahkan jam jika 60 menit
{ min = 0; //untuk kembali ke 0
jam++ ;
}

if (jam == 24) jam=0; //untuk kembali ke 0


}



int main(void)

{

int counter=0; //variabel delay
int digit; //variabel digit yang ditampilkan


// Port untuk display 7 segment
DDRB |= (1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5)|(1<<PB6);
//port untuk scanning ( PD0-4) dan dot ":" (PD6)
DDRD |= (1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3) |(1<<PD6);
//tombol untuk nambah jam/menit
DDRD &= ~(1<<PD4) & ~(1<<PD5) ;

PORTD = (1<<PD6) ; // blink untuk ":"


while(1)

{



counter++ ; //bikin delay nambah terusss

// sesuaikan nilai max counter dengan detik yg pas, tentunya tidak akurat
if(counter == 30) { counter =0 ; clock(); }

// nilai 1/2 dari counter untuk blink ":"
if(counter == 15) PORTD ^=(1<<PD6) ;

else{

segmen(10); // kasi display "mati' agar tidak berbayang

//digit pertama

digit = jam/10;
PORTD |= (1<<PD0); // 7 segment no1 hidup..yg laen mati
PORTD &= ~(1<<PD1) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);

//digit ke 2

segmen(10);
digit = jam%10;
PORTD |= (1<<PD1); // 7 segment no2 hidup..yg laen mati
PORTD &= ~(1<<PD0) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);

//digit ke 3

segmen(10);
digit = min/10;
PORTD |= (1<<PD2); // 7 segment no3 hidup..yg laen mati
PORTD &= ~(1<<PD1) & ~(1<<PD0) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);

//digit ke 4

segmen(10);
digit = min%10;
PORTD |= (1<<PD3); // 7 segment no4 hidup..yg laen mati
PORTD &= ~(1<<PD1) & ~(1<<PD2) & ~(1<<PD0) ;
segmen(digit);
_delay_ms(5);



}

if (bit_is_set(PIND, PIND4)) //tombol nambah jam
{
jam++;
if(jam==24) jam =0;
_delay_ms(100);

}

if (bit_is_set(PIND, PIND5)) //tombol nambah menit
{
min++;
if(min==60) min=0;
_delay_ms(100);

}



}

return 0;

}


jika ingin mengetest/kalibrasi delay detik, ganti salah satu digit untuk menampilkan detik

//digit pertama

digit = detik/10;
PORTD |= (1<<PD0); // 7 segment no1 hidup..yg laen mati
PORTD &= ~(1<<PD1) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);

//digit ke 2

segmen(10);
digit = detik%10;
PORTD |= (1<<PD1); // 7 segment no2 hidup..yg laen mati
PORTD &= ~(1<<PD0) & ~(1<<PD2) & ~(1<<PD3) ;
segmen(digit);
_delay_ms(5);


hasilnya dapat dilihat seperti berikut :


2/22/2013

Bermain Dengan Dot Matrix "LoveHurt"

Siapkan bahan-bahan seperti berikut:




Attiny 2313
Led matrix 7x5
R 10K
Diode 4148
PCB lobang
Header 2x5 buat ISP programmer (optional - Bisa diprogram di Breadboard)
Socket 20 untuk ATtiny, dan soket 14 ( dibelah dua ) buat tempat Led matrix

rangkaiannya seperti ini :



Kemudian komponen dirangkai diatas PCB lobang, ato bisa juga memakai bahan lain( disesuaikan dengan tempat yg mau di pake, misale kotak hadiah , papan tripleks dan lain sebagainya)


letakkan LED MATRIX sesuai dengan SOCKET IC yg dibelah tadi


karena ga ada baterai ( punya tempatnya doang) jadi pake adaptor 3 Volt aja



Script code dalam Bahasa C /WinAvr seperti berikut:


#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h> 
#include <string.h>
#include <avr/eeprom.h>

//Progmem simpannya di FLASH memory

const char love1[] PROGMEM =
{
0b0011110,
0b0100001,
0b1000010,
0b0100001,
0b0011110

};

const char love2[] PROGMEM =
{
0b0001100,
0b0010010,
0b0100100,
0b0010010,
0b0001100

};

const char L[] PROGMEM ={0x7f, 0x7f, 0x40, 0x40, 0x20}; 
const char O[] PROGMEM ={0x3e, 0x7f, 0x41, 0x41, 0x3e};
const char V[] PROGMEM ={0x3f, 0x7e, 0x40, 0x20, 0x1f};
const char E[] PROGMEM ={0x7f, 0x7f, 0x49, 0x49, 0x41};
const char H[] PROGMEM ={0x7f, 0x7f, 0x08, 0x08, 0x7f};
const char U[] PROGMEM ={0x3f, 0x7f, 0x40, 0x40, 0x3f};
const char R[] PROGMEM ={0x7f, 0x7f, 0x11, 0x29, 0x46};
const char T[] PROGMEM ={0x03, 0x03, 0x7f, 0x03, 0x02};

const char creature[]={0x4e, 0x31, 0x35, 0x31, 0x4e}; //simpan di memory/RAM aja

uint8_t EEMEM tengkorak[5]= {0x1e, 0x75, 0x61, 0x75, 0x1e}; //simpan di EEPROM

uint8_t EEMEM pacman[5]= {0x26, 0x67, 0x67, 0x7f, 0x3e}; //simpan di EEPROM


char dotnya[5],scrolnya[7];



void tulis(uint8_t lama)
{
  uint8_t a,b;

for(a=0 ; a<lama ; a++)
{
 for(b=0 ; b<5 ; b++)   
  
{

PORTB = ~(1<<b) ;
PORTD = dotnya[b];
            _delay_ms(2);

     
}

}



}


void geser(uint8_t lama)
{
  uint8_t a,b;

 for(a=0 ; a<11 ; a++)   
  
{

  if( a<6) 
   { 
 for(b=0 ; b<(5-a) ; b++)  dotnya[b]=0x80;
              for(b=(5-a); b<5 ;b++) dotnya[b]=scrolnya[b-5+a];
 
 tulis(10);
             
             }
  else if (a==6) tulis(lama);

  else 
             {  for(b=0 ; b<11-a ; b++) dotnya[b]=scrolnya[a-5+b];
   for(b=(11-a); b<11 ;b++) dotnya[b]=0x80;  
 
                tulis(10);
              }

          }
 
   
                
     

 
}

void naik (uint8_t lama)

{
{  uint8_t q,step=0;
  
  
  while(step!=16)
   {
if( step <8)
  {   
for(q=0 ; q < 5 ; q++) dotnya[q] = scrolnya[q] << (7 - step) ; 

           tulis(10);
        } 
   
    else if (step == 8)
  {    
        tulis(lama); 

       }      
else 
  {   
         for(q=0 ; q < 5 ; q++)  dotnya[q] = scrolnya[q] >> (step - 7) ;  
          
  tulis(10);

     step++; 

}    

}




}


int main(void)
{
DDRD = 0b1111111; // untuk baris
DDRB = 0b11111;  // untuk kolom

PORTD =0; // Set all pins low
PORTB =0b11111; //matikan layar
    
    


while(1)
{
// yang ini nulis langsung 
  
     strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);
strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);
     strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);     

//yang ini pake function geser 

strncpy_P(scrolnya,L,5);
     geser(50);
strncpy_P(scrolnya,O,5);
     geser(50);
strncpy_P(scrolnya,V,5);
     geser(50);
strncpy_P(scrolnya,E,5);
     geser(50);
strncpy_P(scrolnya,H,5);
     geser(50);
strncpy_P(scrolnya,U,5);
     geser(50);
strncpy_P(scrolnya,R,5);
     geser(50);
strncpy_P(scrolnya,T,5);
     geser(50);

//geser ambil dari RAM

strncpy(scrolnya,creature,5);  //tanpa _P karena ambil di RAM
     naik(50);

//ambil dari eeprom ..mengirit..

     eeprom_read_block((void*)&scrolnya,(const void*)&tengkorak, 5); 
naik(50);

     eeprom_read_block((void*)&scrolnya,(const void*)&pacman, 5); 
geser(50);

}

return 0;
}


Script code diatas dibuat dalam mode FLASH, RAM, dan EEPROM, jadi ketika download program ke IC harus memprogram FLASH dulu kemudian dilanjutkan dengan EEPROM.
FLASH extensinya .hex sedangkan isi EEPROM extensinya .eep



hasil akhirnya seperti di video berikut :




SELAMAT MENCOBA

2/18/2013

ATTINY2313 I2C MUSIC PLAYER







setelah berhasil membuat downloader EEPROM serial (I2C) kepikiran juga buat ngemanfaatin eeprom ini untuk nyimpan sesuatu. Bisa aja digunakan menyimpan data text untuk project lovehurts sehingga tulisannya lebih panjang. Tapi kali ini akan saya pergunakan untuk menyimpan data wav

Langkah-langkah yang perlu dikuasai adalah:

1. Memutar wav file (PCM 8bit mono) yang pernah dibahas disini

2. Akses EEPROM dengan I2C menggunakan library Pfleury , untuk librarynya bisa didownload disini


Kita bahas dulu cara akses I2C menggunakan TWIMASTER Pfleury, ada i2cmaster.h (include) i2cmaster.S (add source code) dan twimaster.c (dicopy saja). Secara default library ini menggunakan aturan port SDA / SCL dari ATMEGA, sehingga untuk ATTiny2313 edit i2cmaster.S dibagian ini :

Code:


;***** Adapt these SCA and SCL port and pin definition to your target !!

;

#define SDA      5  // SDA Port B, Pin 5   


#define SCL  7  // SCL Port B, Pin 7

#define SDA_PORT        PORTB           // SDA Port B

#define SCL_PORT        PORTB           // SCL Port B         



Penggunaan library ini menggunakan beberapa perintah seperti berikut :


#define Dev24C64 0xA0

define ini berguna sebagai addressing i2C, karena bus i2C dapat dicascade





untuk IC 24C64 menggunakan addressing 8bit = 1,0,1,0, A2, A1, A0, [direction] , sehingga jika menggunakan 1 buah ic saja maka nilai define adalah 0xA0

i2c_init(); : inisialisasi awal

i2c_start_wait(Dev24C64+I2C_WRITE);
i2c_rep_start(Dev24C02+I2C_READ);

masukkan adress IC + Arah , dalam include sudah di define I2C_WRITE = 0 , I2C_READ =1

sequence untuk menulis :

Code:

     i2c_start_wait(Dev24C64+I2C_WRITE)

     i2c_write(0x05);                        // tulis alamat memory = 5


     i2c_write(0x75);                        // masukkan nilai  0x75ke EEPROM

     i2c_stop();                             // set stop conditon = release bus



sequence untuk membaca data secara satu persatu :

Code:

  

    i2c_start_wait(Dev24C02+I2C_WRITE);  // awal menulis alamat dulu 


    i2c_write(0x05);                        // tulis alamat yang akan dibaca = 5

     i2c_rep_start(Dev24C02+I2C_READ);       // mode baca

     baca = i2c_readNak();                    // baca byte dari EEPROM

     i2c_stop();


sequence untuk membaca seluruh data EEPROM secara berulang :


Code:

  

     i2c_rep_start(Dev24C02+I2C_READ);       // mode baca

     for(;;) baca=i2c_readAck();  // baca terus berulang


setelah mengerti langkah2 ini, maka isi dari ic eeprom dapat diakses dengan mudah.

>> UBAH FILE AUDIO MENJADI FORMAT WAV -PCM -8bit -Mono - 6000hz (48kbps)

caranya ? gunakan software WAVEPAD atau yang lain ..untuk IC 24C64 panjang audio yang dapat diputar berkisar 1.2 - 1.5 detik ...wah pendek banget...ya karena memang tanpa kompresi kok...
selanjutnya jangan lupa download langsung file wav tadi ke dalam ic seperti penjelasan sebelumnya.


SKEMATIK :


*)) ralat R2 dan R3 = 4K7 ohm


lepaskan koneksi ke SDA/SCL ke MOSI/SCK (setelah pull up 4k7)pada saat programming, sehingga IC eeprom tidak terhapus dan pin ISP tidak ter pull up



SCRIPT

Jika masih bingung, harap membaca pembahasan sebelumnya untuk memutar wav di mega8515 , karena hanya diubah sedikit saja

Code:


#define F_CPU 8000000UL

#include <stdint.h>


#include <avr/io.h>

#include <avr/interrupt.h>

#include "i2cmaster.h"



//#define SAMPLE_RATE 8000;

#define Dev24C64 0xA0



int sample_count;


//inisialisasi PWM


void pwm_init(void)

{

    // gunakan OC1A sebagai output 

    DDRB = _BV(PB3);


    /*


    * clear OC1A on compare match

    * set OC1A at BOTTOM, non-inverting mode

    * Fast PWM, 8bit

    */

    TCCR1A = _BV(COM1A1) | _BV(WGM10);

   


    /*

    * Fast PWM, 8bit

    * Prescaler: clk/1 = 8MHz

    * PWM frequency = 8MHz / (255 + 1) = 31.25kHz

    */

    TCCR1B = _BV(WGM12) | _BV(CS10);


   

    /* set initial duty cycle to zero */

    OCR1A = 0;

   

    /* Setup Timer0 */

 

    TCCR0B|=(1<<CS00);


    TCNT0=0;

    TIMSK|=(1<<TOIE0);

    sample_count = 4;

    sei(); //Enable interrupts

}




ISR(TIMER0_OVF_vect)

{

    

         sample_count--;  // menggunakan 4 step 

       if (sample_count == 0)

           {

             sample_count = 4;          


        

    OCR1A = i2c_readAck();   // baca memory secara loop

        

       }

    }




int main(void)


{


   i2c_init(); 

   pwm_init();


 //inisialisasi baca secara terus menerus

 i2c_rep_start(Dev24C64 + I2C_READ); 



   while(1);//muter terus

}





hasilnya seru kayak gini nih......




kalo bisa pake memory yang lebih besar biar lebih panjang lagunya

2/16/2013

Animasi LED


Berdasarkan reques seorang pembaca , posting saya kali ini sesuai dengan video youtube dibawah ini.




Sebenernya project serupa pernah saya bahas di project led berjalan dengan ic 4017, hanya kali ini animasinya lumayan keren dan memakai banyak LED. Untuk mendrive LED yang banyak dibutuhkan transistor dan perhitungan tegangan sumber vs jumlah LED beserta kombinasi rangkaian paralel/seri sesuai rumus di www.ledcalculator.net

Gambaran driving led jumlah  banyak seperti gambar dibawah ini.


Gambar yang diatas menunjukkan 5 buah LED yang langsung dihubungkan ke output 4017 karena ic 4017 diberi tegangan 12volt dimana jika memakai 5 LED maka masing-masing LED mendapatkan tegangan yang cukup. Jika Led lebih banyak maka diperlukan perhitungan seri-paralel sesuai rumus.

Pada video youtube terdapat 4 buah rangkaian LED yang disusun membentuk karakter. Berdasarkan sifat output 4017 maka untuk membuat animasi seperti pada video maka mudah saja dengan memberikan output single pada out  0 - 1 - 2 - 3  ke masing-masing huruf. Sedangkan untuk membikin kedip bareng maka yang disambungkan secara paralel adalah output 5 - 7 - 9. Agar animasi sesuai dan tidak numpuk maka ditambahkan dioda small signal 1N4148 yang disusun seperti rangkaian berikut:



(klik untuk memperbesar)



Mudah Bukan ? Selamat Mencoba

2/14/2013

Menghitung RPM (TACHOMETER) dari Radiasi Kabel busi




RPM ( round per minute ) adalah angka yang menunjukkan banyaknya putaran suatu system dalam 1 menit. Biasanya dimanfaatkan sebagai penunjuk putaran mesin pada kendaraan bermotor, sehingga mempermudah dalam pengaturan tenaga dan bahan bakar. Alat pengukur ini lazim disebut TACHOMETER.

Pada sebuah kendaraan roda 2, putaran mesin dapat diperoleh dengan menghitung pulsa pada dinamo, tetapi hal ini susah karena harus membuka blok mesin. Cara paling mudah adalah dengan memanfaatkan radiasi dari CDI ke BUSI yang dapat dihitung jumlah pulsanya. Jadi dengan menggunakan prinsip radiasi elektromagnet, cukup dengan melilitkan kawat tembaga/email/enamel/kabel dinamo  ke kabel di dekat ujung tutup busi, maka tegangan yang konstan (pulsa) dapat diperoleh. Jumlah lilitan tidaklah penting, cukup dikira-kira saja sampai tegangan yg dihasilkan dapat mengaktifkan transistor sebagai switch penghitung.

Tidak perlu menunggu 1 menit untuk mengeluarkan nilai RPM, dengan memanfaatkan fasilitas counter pada microcontroller maka nilai RPM dapat diperoleh. Semisal kita melakukan sampling pengambilan data RPM per 1 detik. Maka RPM didapat melalui rumus :


RPM = Jumlah Pulsa  x 60

jika ingin lebih cepat, semisal 0,5 detik, maka nilai RPM didapat dengan mengalikan jumlah pulsa yg terjadi dengan angka 120.










Skematik dibawah ini memanfaatkan microcontroller attiny2313, dan menggunakan transistor sebagai switch pulsa.


Skematik dibawah ini memanfaatkan microcontroller attiny2313, dan menggunakan transistor sebagai switch pulsa.





sedangkan scriptnya seperti berikut ini :

#define F_CPU 1000000UL // frek clock internal
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/iotn2313.h>
#include <avr/pgmspace.h> 

uint8_t angka1=10 ;
uint8_t angka2=10 ;
uint8_t angka3=10 ;
uint8_t angka4=10 ;
uint8_t segstep=0;

uint8_t kalibrasi=3;

int number=0;

void conv_segmen(uint8_t digit)//nampilin segmen

{
switch (digit) 
{

case 0 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB5);
PORTB |= _BV(PB6) ;
break;
}
case 1 :
{
PORTB &= ~_BV(PB1) & ~_BV(PB2) ;
PORTB |= _BV(PB0) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ;
break;
}
case 2 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB6) ;
PORTB |= _BV(PB2) | _BV(PB5) ;
break;
}
case 3 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB6) ;
PORTB |= _BV(PB4) | _BV(PB5) ;
break;
}
case 4 :
{
PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB5) & ~_BV(PB6) ;
PORTB |= _BV(PB0) | _BV(PB3) | _BV(PB4) ;
break;
}
case 5 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB5) & ~_BV(PB6) ;
PORTB |= _BV(PB1) | _BV(PB4) ;
break;
}
case 6 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB5) & ~_BV(PB6) ;
PORTB |= _BV(PB1) ;
break;
}
case 7 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) ;
PORTB |= _BV(PB3) | _BV(PB4) | _BV(PB5)| _BV(PB6) ;
break;
}
case 8 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB5) & ~_BV(PB6);
break;
}
case 9 : 
{
PORTB &= ~_BV(PB0) & ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB5) & ~_BV(PB6);
PORTB |= _BV(PB4) ;
break;
}
case 10 :
{
PORTB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ;
break;
}
}
}



void init_ctr(void) //counter tampilan
{



TCCR0A |= (1 << WGM01); // Configure timer 0 for CTC mode
TIMSK |= (1 << OCIE0A); // Enable CTC interrupt
OCR0A = 50; // Set CTC compare value till blink disapear at 1MHz AVR clock, with a prescaler of 64
TCCR0B |= (1 << CS01)|(1 << CS00); // Start timer at Fcpu/64


}


void init_ctr1(void)//counter perhitungan 600ms sampling
{

TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
OCR1A = 586; //compare the CTC A = 600ms =586
TCCR1B |= ((1 << CS10) | (1 << CS12)); // Start timer at Fcpu/1024

}


ISR(TIMER1_COMPA_vect) //timer capture RPM counter

{ uint16_t rpm;


switch(kalibrasi) { 
case 1 :{ 
rpm=number/100;
break; }

case 2 :{ 
rpm=number/10;
break; }

case 3 :{ 
rpm=number;
break; }

case 4 :{ 
rpm=number*10;
break; }

case 5 :{ 
rpm=number*100;
break; }
default: rpm=0;
}

angka1 = rpm%10;

if(rpm>9) angka2 = ((rpm%100) - (rpm%10)) /10 ;
else angka2=10;

if(rpm>99) angka3 = ((rpm%1000) - (rpm%100)) /100 ;
else angka3=10;

if(rpm>999) angka4 = ((rpm%10000) - (rpm%1000)) /1000 ;
else angka4=10;


number=0;
}

ISR(TIMER0_COMPA_vect) // timer pindah kolom
{



segstep++;

switch(segstep) { 
case 1 :{ conv_segmen(10);
PORTD |= _BV(PD0);
PORTD &= ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD5) ;
conv_segmen(angka1);
break;
}

case 2 :{ conv_segmen(10);
PORTD |= _BV(PD1);
PORTD &= ~_BV(PD0) & ~_BV(PD4) & ~_BV(PD5) ;
conv_segmen(angka2);
break;
}
case 3 :{ conv_segmen(10);
PORTD |= _BV(PD4);
PORTD &= ~_BV(PD1) & ~_BV(PD0) & ~_BV(PD5) ;
conv_segmen(angka3);
break;
}
case 4 :{ conv_segmen(10);
PORTD |= _BV(PD5);
PORTD &= ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD0) ;
conv_segmen(angka4);
segstep=0;
break; 
}

}



}


SIGNAL (SIG_INT0)
{
number++;

}

SIGNAL (SIG_INT1)
{

cli();
conv_segmen(10);

_delay_ms(500);

kalibrasi++;

if (kalibrasi == 6) kalibrasi=1;

eeprom_write_byte((uint8_t*)10, kalibrasi);


sei();
}


void baca_eeprom(void)
{

kalibrasi = eeprom_read_byte((uint8_t*)10);

if(kalibrasi == 0xFF) kalibrasi=3;


}

int main(void)
{

GIMSK |= (1<<INT0)|(1<<INT1); 
MCUCR |= (1<<ISC01)| (1<<ISC11); //fall edge 

DDRD = _BV(PD0) | _BV(PD1) | _BV(PD4) | _BV(PD5) ; // seg select
DDRB = _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) ; // seg a,b,c,d,e,f,g


init_ctr();
init_ctr1();
baca_eeprom();
sei();
while(1)

{
}
}


SELAMAT MENCOBA 
Older Posts Home
Aulia DirUt. Powered by Blogger.
 

Labels

Followers

 

Templates by Nano Yulianto | CSS3 by David Walsh | Powered by {N}Code & Blogger